import cv2
import numpy as np

def find_template_in_image(template_path, source_image_path):
    # 读取源图像和模板图像
    source_image = cv2.imread(source_image_path, cv2.IMREAD_GRAYSCALE)
    template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)

    # 获取模板图像的宽度和高度
    template_height, template_width = template.shape

    # 使用模板匹配方法进行匹配
    result = cv2.matchTemplate(source_image, template, cv2.TM_CCOEFF_NORMED)

    # 找到匹配位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    print(f"匹配结果：{min_val} _ {max_val}")

    # 如果使用 TM_SQDIFF 或 TM_SQDIFF_NORMED，则取最小值
    # 这里使用的是 TM_CCOEFF_NORMED，所以取最大值
    top_left = max_loc
    # 计算右下角坐标
    bottom_right = (top_left[0] + template_width, top_left[1] + template_height)

    # 计算中心坐标
    center = (top_left[0] + template_width // 2, top_left[1] + template_height // 2)

    # 原图上十字标记中心点
    cv2.rectangle(source_image, top_left, bottom_right, (0, 0, 255), 2)

    # 显示结果
    # cv2.imshow("result", source_image)
    # cv2.waitKey(0)

    # 返回模板在源图像中的坐标
    return (top_left, bottom_right, center , max_val)

# 示例使用
if __name__ == "__main__":
    template_path = "C:\\Users\\liuxi\\Desktop\\2.png"  # 模板图片路径
    source_image_path = "C:\\Users\\liuxi\\Desktop\\1.png"  # 源图片路径

    top_left, bottom_right ,center ,max_val = find_template_in_image(template_path, source_image_path)
    print(f"模板在源图像中的坐标范围：左上角({top_left[0]}, {top_left[1]})，右下角({bottom_right[0]}, {bottom_right[1]}) , 概率值：{max_val}\r\n")

    template_path = "C:\\Users\\liuxi\\Desktop\\3.png"  # 模板图片路径
    source_image_path = "C:\\Users\\liuxi\\Desktop\\1.png"  # 源图片路径

    top_left, bottom_right ,center,max_val = find_template_in_image(template_path, source_image_path)
    print(f"模板在源图像中的坐标范围：左上角({top_left[0]}, {top_left[1]})，右下角({bottom_right[0]}, {bottom_right[1]}), 概率值：{max_val}")